home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / SLAX 6.0.8 / slax-6.0.8.iso / slax / base / 006-devel.lzm / usr / include / ntfs-3g / mft.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-10-26  |  4.6 KB  |  133 lines

  1. /*
  2.  * mft.h - Exports for MFT record handling. Originated from the Linux-NTFS project.
  3.  *
  4.  * Copyright (c) 2000-2002 Anton Altaparmakov
  5.  * Copyright (c) 2004-2005 Richard Russon
  6.  * Copyright (c) 2006-2008 Szabolcs Szakacsits
  7.  *
  8.  * This program/include file is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License as published
  10.  * by the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program/include file is distributed in the hope that it will be
  14.  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  15.  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program (in the main directory of the NTFS-3G
  20.  * distribution in the file COPYING); if not, write to the Free Software
  21.  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  */
  23.  
  24. #ifndef _NTFS_MFT_H
  25. #define _NTFS_MFT_H
  26.  
  27. #include "volume.h"
  28. #include "inode.h"
  29. #include "layout.h"
  30. #include "logging.h"
  31.  
  32. extern int ntfs_mft_records_read(const ntfs_volume *vol, const MFT_REF mref,
  33.         const s64 count, MFT_RECORD *b);
  34.  
  35. /**
  36.  * ntfs_mft_record_read - read a record from the mft
  37.  * @vol:    volume to read from
  38.  * @mref:    mft record number to read
  39.  * @b:        output data buffer
  40.  *
  41.  * Read the mft record specified by @mref from volume @vol into buffer @b.
  42.  * Return 0 on success or -1 on error, with errno set to the error code.
  43.  *
  44.  * The read mft record is mst deprotected and is hence ready to use. The caller
  45.  * should check the record with is_baad_record() in case mst deprotection
  46.  * failed.
  47.  *
  48.  * NOTE: @b has to be at least of size vol->mft_record_size.
  49.  */
  50. static __inline__ int ntfs_mft_record_read(const ntfs_volume *vol,
  51.         const MFT_REF mref, MFT_RECORD *b)
  52. {
  53.     int ret; 
  54.     
  55.     ntfs_log_enter("Entering for inode %lld\n", MREF(mref));
  56.     ret = ntfs_mft_records_read(vol, mref, 1, b);
  57.     ntfs_log_leave("\n");
  58.     return ret;
  59. }
  60.  
  61. extern int ntfs_mft_record_check(const ntfs_volume *vol, const MFT_REF mref, 
  62.         MFT_RECORD *m);
  63.  
  64. extern int ntfs_file_record_read(const ntfs_volume *vol, const MFT_REF mref,
  65.         MFT_RECORD **mrec, ATTR_RECORD **attr);
  66.  
  67. extern int ntfs_mft_records_write(const ntfs_volume *vol, const MFT_REF mref,
  68.         const s64 count, MFT_RECORD *b);
  69.  
  70. /**
  71.  * ntfs_mft_record_write - write an mft record to disk
  72.  * @vol:    volume to write to
  73.  * @mref:    mft record number to write
  74.  * @b:        data buffer containing the mft record to write
  75.  *
  76.  * Write the mft record specified by @mref from buffer @b to volume @vol.
  77.  * Return 0 on success or -1 on error, with errno set to the error code.
  78.  *
  79.  * Before the mft record is written, it is mst protected. After the write, it
  80.  * is deprotected again, thus resulting in an increase in the update sequence
  81.  * number inside the buffer @b.
  82.  *
  83.  * NOTE: @b has to be at least of size vol->mft_record_size.
  84.  */
  85. static __inline__ int ntfs_mft_record_write(const ntfs_volume *vol,
  86.         const MFT_REF mref, MFT_RECORD *b)
  87. {
  88.     int ret; 
  89.     
  90.     ntfs_log_enter("Entering for inode %lld\n", MREF(mref));
  91.     ret = ntfs_mft_records_write(vol, mref, 1, b);
  92.     ntfs_log_leave("\n");
  93.     return ret;
  94. }
  95.  
  96. /**
  97.  * ntfs_mft_record_get_data_size - return number of bytes used in mft record @b
  98.  * @m:        mft record to get the data size of
  99.  *
  100.  * Takes the mft record @m and returns the number of bytes used in the record
  101.  * or 0 on error (i.e. @m is not a valid mft record).  Zero is not a valid size
  102.  * for an mft record as it at least has to have the MFT_RECORD itself and a
  103.  * zero length attribute of type AT_END, thus making the minimum size 56 bytes.
  104.  *
  105.  * Aside:  The size is independent of NTFS versions 1.x/3.x because the 8-byte
  106.  * alignment of the first attribute mask the difference in MFT_RECORD size
  107.  * between NTFS 1.x and 3.x.  Also, you would expect every mft record to
  108.  * contain an update sequence array as well but that could in theory be
  109.  * non-existent (don't know if Windows' NTFS driver/chkdsk wouldn't view this
  110.  * as corruption in itself though).
  111.  */
  112. static __inline__ u32 ntfs_mft_record_get_data_size(const MFT_RECORD *m)
  113. {
  114.     if (!m || !ntfs_is_mft_record(m->magic))
  115.         return 0;
  116.     /* Get the number of used bytes and return it. */
  117.     return le32_to_cpu(m->bytes_in_use);
  118. }
  119.  
  120. extern int ntfs_mft_record_layout(const ntfs_volume *vol, const MFT_REF mref,
  121.         MFT_RECORD *mrec);
  122.  
  123. extern int ntfs_mft_record_format(const ntfs_volume *vol, const MFT_REF mref);
  124.  
  125. extern ntfs_inode *ntfs_mft_record_alloc(ntfs_volume *vol, ntfs_inode *base_ni);
  126.  
  127. extern int ntfs_mft_record_free(ntfs_volume *vol, ntfs_inode *ni);
  128.  
  129. extern int ntfs_mft_usn_dec(MFT_RECORD *mrec);
  130.  
  131. #endif /* defined _NTFS_MFT_H */
  132.  
  133.